package main

import (
	"gitee.com/dreamwood/jxgo/v1/dev"
	"reflect"
)

func main() {
	m := new(MyModel)
	dev.PrintDebugGo(m.getFields())
}

type BaseModel struct {
}

type MyModel struct {
	BaseModel
	Name string
}

// 修改 getFields 方法，使其能够获取嵌入结构体的字段
func (b *BaseModel) getFields() []string {
	println(reflect.TypeOf(b).String())

	t := reflect.TypeOf(b).Elem()
	var fields []string

	// 遍历所有字段，包括嵌入的结构体字段
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		// 如果是嵌入的匿名字段，则递归获取其字段
		if field.Anonymous {
			// 获取嵌入结构体的字段
			embeddedFields := getEmbeddedFields(field.Type)
			fields = append(fields, embeddedFields...)
		} else {
			fields = append(fields, field.Name)
		}
	}
	return fields
}

// 辅助函数：获取嵌入结构体的所有字段名
func getEmbeddedFields(t reflect.Type) []string {
	// 如果是指针类型，获取其指向的类型
	if t.Kind() == reflect.Ptr {
		t = t.Elem()
	}

	var fields []string
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		fields = append(fields, field.Name)
	}
	return fields
}
